package com.jgp.common.utils;


import org.apache.commons.io.FileUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.ClassUtils;

import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件操作工具类
 * 项目   sys
 * 作者   loufei
 * 时间   2018/2/25
 */
public class FileUtil {
    
    private static ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
    /**
     * 格式化容量
     *
     * @param size Byte
     * @return KB MB GB
     */
    public static String capacityFormat(long size) {
        return CapacityFormat.B.convert(size);
    }

    /**
     * 复制文件或者目录,复制前后文件完全一样。
     *
     * @param resFilePath 源文件路径
     * @param distFolder  目标文件夹
     * @throws IOException IOException
     */
    public static void copyFile(String resFilePath, String distFolder) throws IOException {
        File resFile = new File(resFilePath);
        File distFile = new File(distFolder);
        if (resFile.isDirectory()) { // 目录时
            FileUtils.copyDirectoryToDirectory(resFile, distFile);
        } else if (resFile.isFile()) { // 文件时
            // FileUtils.copyFileToDirectory(resFile, distFile, true);
            FileUtils.copyFileToDirectory(resFile, distFile);
        }
    }

    /**
     * 通过流复制文件。
     *
     * @param resInputStream 源文件流
     * @param distFolder     目标文件夹
     * @throws IOException IOException
     */
    public static void copyFile(InputStream resInputStream, String distFolder) throws IOException {
        FileUtils.copyInputStreamToFile(resInputStream, new File(distFolder));
    }


    /**
     * 删除一个文件或者目录
     *
     * @param fileOrDir 文件或者目录路径
     * @throws IOException IOException
     */
    public static void deleteFileOrDir(String fileOrDir) throws IOException {
        File targetFile = new File(fileOrDir);
        if (targetFile.isDirectory()) {
            FileUtils.deleteDirectory(targetFile);
        } else if (targetFile.isFile()) {
            targetFile.delete();
        }
    }

    /**
     * @param partFiles    分片文件
     * @param destFile 新文件
     * @description 合并分片文件到新文件里面
     */
    public static void mergeFile(List<File> partFiles, File destFile) {
        for (File partFile : partFiles) {
            mergeFile(partFile, destFile);
        }
    }

    /**
     * @param partFile     分片文件
     * @param destFile 新文件
     * @description 合并分片文件到新文件里面
     */
    public static  void mergeFile(File partFile, File destFile) {
        byte[] b = new byte[1024000];
        try(FileInputStream fis = new FileInputStream(partFile);FileOutputStream fos = new FileOutputStream(destFile, true)){
            int n;
            while ((n = fis.read(b)) != -1) {
                fos.write(b, 0, n);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    
    }

    /**
     * 读取文件到字符串
     *
     * @param filePath 全路径 文件路径+文件名
     * @return 文件文本内容
     * @throws IOException IOException
     */
    public static String file2String(String filePath) throws IOException {
        return FileUtils.readFileToString(new File(filePath), "UTF-8");
    }

    /**
     * 把byte数组转换成File文件
     *
     * @param data     数据
     * @param distFile 目标文件 路径+文件名
     * @throws IOException IOException
     */
    public static void data2File(byte[] data, String distFile) throws IOException {
        FileUtils.writeByteArrayToFile(new File(distFile), data);
    }

    /**
     * 将字符串写入指定文件
     *
     * @param str      字符串
     * @param distFile 目标文件
     * @param encoding 编码
     * @throws IOException IOException
     */
    public static void string2File(String str, String distFile, String encoding) throws IOException {
        FileUtils.writeStringToFile(new File(distFile), str, encoding);
    }

    /**
     * 取得指定文件内容
     *
     * @param distFile 目标文件 全路径
     * @return 文件行集合
     * @throws IOException IOException
     */
    public static List<String> readAllLines(String distFile) throws IOException {
        File dist = new File(distFile);
        if (!(dist.exists())) {
            return new ArrayList<>();
        }
        return FileUtils.readLines(dist, Charset.defaultCharset());
    }

    /**
     * 给指定文件追加内容
     *
     * @param distFile 目标文件 全路径
     * @param lines    文件行集合
     * @throws IOException IOException
     */
    public static void appendLines(String distFile, List<String> lines) throws IOException {
        FileUtils.writeLines(new File(distFile), lines);
    }

    /**
     * 输入流转字符串
     *
     * @param is InputStream
     * @return String
     */
    public static String inputStream2Str(InputStream is) {
        try (InputStreamReader inputStreamReader = new InputStreamReader(is, "utf-8"); BufferedReader
                bufferedReader = new BufferedReader(inputStreamReader)) {
            StringBuffer buffer = new StringBuffer();
            String str;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            return buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 读取 resources 资源目录下 *.json 文件
     *
     * @param distFile 目标文件
     * @return JSONObject
     *//*
    public static JSONObject readResourceJsonFile2JsonObject(String distFile) {
        return new JSONObject(readResourceFileToString(distFile));
    }

    *//**
     * 读取 resources 资源目录下 *.json 文件
     *
     * @param distFile 目标文件
     * @return JSONArray
     *//*
    public static JSONArray readResourceJsonFile2JsonArray(String distFile) {
        return new JSONArray(readResourceFileToString(distFile));
    }*/

    /**
     * 读取 resources 资源目录下文件
     *
     * @param distFile 目标文件
     * @return 内容字符串
     */
    public static String readResourceFileToString(String distFile) {
        InputStream is = FileUtil.class.getClassLoader().getResourceAsStream(distFile);
        return inputStream2Str(is);
    }
    
    public static Resource[] scanSinglePathFiles(String path,String regex) throws IOException {
        String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + String.format
                (regex, ClassUtils.convertClassNameToResourcePath(path));
        return resourcePatternResolver.getResources(pattern);
    }
    
    public static Resource[] scanFiles(String path,String regex) throws IOException {
        String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + String.format
                ("**/"+regex, ClassUtils.convertClassNameToResourcePath(path));
        return resourcePatternResolver.getResources(pattern);
    }
    
    
    public static Resource[] scanAllMenuJsonFile() throws IOException {
        return resourcePatternResolver.getResources("classpath*:*_menu.json");
    }
    
    public static void mergeAndRemoveTempFile(List<File> tempPartFiles, File diskFile) {
        for (File tempPartFile : tempPartFiles) {
            mergeFile(tempPartFile, diskFile);
            tempPartFile.delete();
        }
    }
}
